package com.cevent.common.service;

import com.cevent.common.domain.ModuleBase;
import com.cevent.common.domain.ModuleBaseExample;
import com.cevent.common.dto.ModuleBaseChildrenDto;
import com.cevent.common.dto.ModuleBaseDto;
import com.cevent.common.dto.NodeDto;
import com.cevent.common.dto.PageDto;
import com.cevent.common.mapper.ModuleBaseMapper;
import com.cevent.common.mapper.defMapper.ModuleBaseDefMapper;
import com.cevent.common.util.CopyUtil;
import com.cevent.common.util.DataUtil;
import com.cevent.common.util.UuidUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;


/**
 * @description 模块基础表
 * @author cevent
 * @create 2025-03-31 15:03:19
 */
@Service
public class ModuleBaseService {

    private static final Logger LOG= LoggerFactory.getLogger(ModuleBaseService.class);

    @Resource
    private ModuleBaseMapper moduleBaseMapper;
    @Resource
    private ModuleBaseDefMapper moduleBaseDefMapper;

    //如果需要返回指定类型，则指定List<Dto>，这里因为前端传入的pageDto对象，不做处理也会返回PageDto，所以这里没有return
    public void getList(PageDto pageDto,String domain){

        String domainId="";
        if (!StringUtils.isEmpty(domain)){
            domainId="TODO 请求site配置数据，获取domainId";
        }

        PageHelper.startPage(pageDto.getPage(),pageDto.getSize());
        ModuleBaseExample moduleBaseExample=new ModuleBaseExample();
        // moduleBaseExample.createCriteria().andUniIdEqualTo("1");
        ModuleBaseExample.Criteria criteria=moduleBaseExample.createCriteria();
        if(domainId!=""){
            criteria.andDomainIdEqualTo(domainId);
        }
        moduleBaseExample.setOrderByClause("sort desc");
        List<ModuleBase> list=moduleBaseMapper.selectByExample(null);

        //select获取数据后，Pageinfo接收查询结果
        PageInfo<ModuleBase> pageInfo=new PageInfo<>(list);

        // List 需要 new ArrayList< entity >
        List<ModuleBaseDto> lists= new ArrayList<ModuleBaseDto>();
        for (int i = 0, l = list.size(); i < l; i++) {
            ModuleBase moduleBase=list.get(i);
            ModuleBaseDto moduleBaseDto=new ModuleBaseDto();
            //赋值
            BeanUtils.copyProperties(moduleBase,moduleBaseDto);
            lists.add(moduleBaseDto);
        }

        //赋值pageinfo List
        pageDto.setTotal(pageInfo.getTotal());
        pageDto.setList(lists);

        //如果不返回分页数据，则输出lists即可，注意list<dto对象>
        // return pageDto;
    }

    //获取tree结构数据
    public List<ModuleBaseChildrenDto> getTree(String domain){
        String dominId="";
        if(!StringUtils.isEmpty(domain)){
            LOG.info("TODO 请求site配置数据，获取domainId: {}",domain);
        }

        //获取分类
        ModuleBaseExample example=new ModuleBaseExample();
        ModuleBaseExample.Criteria criteria=example.createCriteria();
        // criteria.andDomainIdEqualTo(dominId);
        example.setOrderByClause("sort asc");
        List<ModuleBase> moduleCategories=moduleBaseMapper.selectByExample(example);

        //生成children
        List<ModuleBaseChildrenDto> childrenDtos=CopyUtil.copyList(moduleCategories, ModuleBaseChildrenDto.class);
        //获取一级分类
        List<ModuleBaseChildrenDto> level1=childrenDtos.stream().filter((category)->{
            return category.getParentId().equals("0");
        }).map((child)->{
            child.setChildren(getChildren(child,childrenDtos));
            return child;
        }).sorted((cat1,cat2)->{
            return (cat1.getSort() == null ? 0 : cat1.getSort()) - (cat2.getSort() == null ? 0 : cat2.getSort());
        }).collect(Collectors.toList());

        return level1;
    }

    //递归查询子分类
    private List<ModuleBaseChildrenDto> getChildren(ModuleBaseChildrenDto childrenDto,List<ModuleBaseChildrenDto> childrenDtoList){
        List<ModuleBaseChildrenDto> childrens=childrenDtoList.stream().filter(category->{
            return category.getParentId().equals(childrenDto.getUniId());
        }).map((child)->{
            child.setChildren(getChildren(child,childrenDtoList));
            return child;
        }).sorted((cat1,cat2)->{
            //避免空指针异常
            return (cat1.getSort() == null ? 0 : cat1.getSort()) - (cat2.getSort() == null ? 0 : cat2.getSort());
        }).collect(Collectors.toList());

        return childrens;
    }

    public void save(ModuleBaseDto moduleBaseDto,String domain){
        //isEmpty被弃用，hasText可校验""/" "/null
        if(StringUtils.hasText(moduleBaseDto.getParentId()) || moduleBaseDto.getParentId()==null){
            moduleBaseDto.setParentId("0");
        }
        if(!StringUtils.hasText(moduleBaseDto.getUniId())){
            this.insert(CopyUtil.copy(moduleBaseDto,ModuleBase.class));
        }else{
            //优化，只更新传入的字段
            this.update(CopyUtil.copy(moduleBaseDto,ModuleBase.class));
        }
    }

    private void insert(ModuleBase moduleBase){
        moduleBase.setUniId(UuidUtil.getUuid8());
        Date now=new Date();
        String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
        moduleBase.setCreateTime(now);
        moduleBase.setUpdateTime(now);
        moduleBaseMapper.insert(moduleBase);
    }

    private void update(ModuleBase moduleBase){
        Date now=new Date();
        String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
        moduleBase.setUpdateTime(now);
        moduleBaseMapper.updateByPrimaryKey(moduleBase);
    }

    public ModuleBaseDto detail(String uniId){
        ModuleBase moduleBase=new ModuleBase();
        if(uniId != ""){
            moduleBase=moduleBaseMapper.selectByPrimaryKey(uniId);
        }
        return CopyUtil.copy(moduleBase,ModuleBaseDto.class);
    }

    public Boolean delete(String uniId,String domian){
        //TODO 先根据id和domain查询是否是当前站点的分类数据
        Integer flag=0;
        if(StringUtils.hasText(uniId)){
            flag=moduleBaseMapper.deleteByPrimaryKey(uniId);
        }

        return flag>0;
    }

    public List<ModuleBaseChildrenDto> saveTree(List<ModuleBaseChildrenDto> childrenDtos,String domain){
        String dominId="";
        if(!StringUtils.isEmpty(domain)){
            LOG.info("TODO 请求site配置数据，获取domainId: {}",domain);
        }
        List<ModuleBaseChildrenDto> result= DataUtil.flattenChildrenModuleBase(childrenDtos);
        List<ModuleBase> moduleBaseList=CopyUtil.copyList(result,ModuleBase.class);
        for (int i = 0, l = moduleBaseList.size(); i < l; i++) {

            ModuleBase moduleBase=moduleBaseList.get(i);
            // moduleBaseMapper.updateByPrimaryKeySelective(moduleBase);
            //自定义mapper
            int flag= moduleBaseDefMapper.moduleBaseTreeDragSave(moduleBase.getUniId(),moduleBase.getParentId(),moduleBase.getSort(),moduleBase.getLevel());

        }
        return result;
    }

}
